IAM ポリシーの記法について理解する
こんにちは!よしななです。
今回は、IAM ポリシーの JSON 記法についてなんとなく理解していたところをもう一度理解しなおしたのでまとめました。
目次
- 基本的な構文
- 構文詳細
- Version
- Statements
- Sid
- Effect
- principal
- Action
- Resource
- Condition
- まとめ
- 参考文献
基本的な構文
IAM ポリシーの 基本的な JSON 構文は以下となります。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": ""
},
"Action": "",
"Resource": "",
"Condition": {
"Bool": {
"": ""
}
}
}
]
}
通常の JSON と同様に、以下のルールで記述していきます。
- JSON は
{ }
、[]
、,
、:
の文字構造と文字列、数字、true / false / null
で構成される - オブジェクトもしくは配列を使用する
また、オブジェクトについては以下のルールに従って記述します。
- 1個以上の名前と値のペアがあること
- 名前は文字列で、ダブルクォートで囲み、名前と値の間はコロンで区切ること
- 前の値と次の値はコンマで区切る
- 入れ子構造にしたい場合、値を中括弧
{}
で囲むこと
参考サイト:
RFC 8259 - The JavaScript Object Notation (JSON) Data Interchange Format
構文詳細
次に IAM ポリシーを構成する要素についてまとめます。
Version
IAM ポリシーの構文ルールのバージョンを示しています。
現時点では2012-10-17
と2008-10-17
の2種類のみが定義されています。
2008-10-17
は旧バージョンにあたるため、新しいバージョンである2012-10-17
を使用します。
Statement
作成する IAM ポリシーについての条件をこちらに記載していきます。
1つのポリシー内に複数のステートメントがあり、1つのリクエストに対して複数のステートメントが当てはまる場合は OR 判定されます。
ステートメントの中身は以下の通りです、
Sid
任意でステートメントの ID を命名することが可能です。
なるべくわかりやすい命名を心がけます。
Effect
Allow
を設定すると許可、Deny
を設定すると拒否になります。
優先順位は以下の通りです。
- 明示的な拒否...
Effect
に記載したDeny
が最優先される - 明示的な許可...
Effect
に記載したAllow
が明示的な拒否の次に優先される - 暗黙的な拒否...
Allow
の対象にない Action は全て拒否(暗黙的な拒否)となる
Principal
AWS アカウントやサービスからリソースへのアクセスを許可 / 拒否することが可能です。
例えば、以下の図のように AWS アカウントA(アカウントID:012345678901
) にある IAM ユーザー:yoshinana-test
から AWS アカウントB(アカウントID:123456789012
) にある EC2 インスタンスにアクセスしたいとします。
図:
その場合、AWS アカウントB の IAM ロールを作成し、JSON 内のPrincipal
に AWS アカウントA の アカウントID と IAM ユーザー名を指定し、EC2 の操作を許可することによって EC2 へのアクセスが可能になります。
例:
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::012345678901:user/yoshinana-test"
},
Action
AWS 上で実行する操作を指定します。
例えば、Amazon S3 へファイルのアップロードを許可する場合、s3.putObject
を指定します。
全てのAction
リストは以下となります。
Actions, resources, and condition keys for AWS services - Service Authorization Reference
Resource
ポリシーが適用されるオブジェクトをResource
内で定義します。
Amazon リソースネーム (ARN) を使用してリソースを指定します。ARN の形式は、AWS のサービスおよび参照先の特定のリソースによってそれぞれ違いがあります。
例えば、Amazon S3 バケットtest-s3-bucket
内のすべてを指定したい場合、以下のように記述します。
アスタリスク(*
)を入れることにより、test-s3-bucket
内の全てと置き換えることが可能です。
"Resource": "arn:aws:s3:::test-s3-bucket/*",
Condition
ポリシーを実行するタイミングの条件を指定することができます。
Bool
条件演算子を使用して特定の IAM ユーザー以外はDeny
する、IpAddress
条件演算子を使用して特定の IP アドレスはAllow
し、それ以外はDeny
するといった条件の制御が可能です。
Condition
の記法として、1つ目のネストに条件演算子、2つ目のネストに条件の値を指定します。
例えば、IpAddress
条件演算子を使用して特定の IP アドレス0.0.0.0/0
をAllow
する場合、以下のように記述します。
"Condition": {
"IpAddress": {
"aws:SourceIp": "0.0.0.0/0"
}
}
また、Deny
とNotIpAdress
を使用して特定の IP アドレス以外は全て拒否するといったことも可能です。
以下ですと、10.0.10.0
以外のアクセスを全て拒否、という表現になります。
"Effect": "Deny",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "10.0.10.0/0"
}
}
参考ドキュメント:
IAM JSON ポリシー要素NotAction - AWS Identity and Access Management
その他の条件演算子は以下となります。
IAM JSON ポリシー要素: 条件演算子 - AWS Identity and Access Management
まとめ
以上で、「IAM ポリシーの記法について理解する」は以上となります。
今までCondition
などはふわっとしか理解していなかったのですが、より深く理解することができました!
ここまで読んでいただき、ありがとうございました。